package ifrn.agendaweb.controlador;

import ifrn.agendaweb.modelo.Grupo;
import ifrn.agendaweb.modelo.Usuario;
import ifrn.agendaweb.modelo.validador.GrupoValidador;
import ifrn.agendaweb.servico.GrupoServico;
import ifrn.agendaweb.servico.ServicoException;

import java.text.SimpleDateFormat;
import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/pri/grupo/**")
public class GrupoControlador {

	private GrupoServico grupoServico;
	@Autowired
	public void setGrupoServico(GrupoServico grupoServico) {
		this.grupoServico = grupoServico;
	}
	
	@Autowired
	Grupo grupo;
	
	@Autowired
	Usuario usuarioSessao;

	/*validador*/
	@Autowired
    private GrupoValidador grupoValidador;
 
	@InitBinder
	protected void initBinder(WebDataBinder binder) {
		binder.setValidator(new GrupoValidador());
	}


	@RequestMapping("/")
	public String exibir(@RequestParam("id") Integer id, Model modelo, Grupo grupo) {
		
		try {
			grupo.setId(id);
			grupo = grupoServico.recuperar(grupo);
			modelo.addAttribute("grupo", grupo);
			return "grupo.detalhe";
		} catch (Exception pex) {
			modelo.addAttribute("erro", pex.getMessage());
			return listar(modelo);
		}
	}
	
	@RequestMapping("/index")
	public String cadastro(Model modelo) {
		modelo.addAttribute("grupo", new Grupo());
		return "grupo.formulario";
	}
	
	@RequestMapping("/formularioAtualizar")
	public String formularioAtualizar(@RequestParam("id") Integer id, Model modelo, Grupo grupo) {
		try {
			grupo.setId(id);
			
			grupo = grupoServico.recuperar(grupo);
			
			modelo.addAttribute("grupo", grupo);
			return "grupo.formularioAtualizar";
		} catch (Exception pex) {
			modelo.addAttribute("erro", pex.getMessage());
			return listar(modelo);
		}
	}


	@RequestMapping(value="/criar", method=RequestMethod.POST)
	public String create(@Valid Grupo grupo, BindingResult result, Model modelo){

		
		//verifica se os campos dos formulários são válidos
		if (!result.hasFieldErrors()) {
			
			try {
//				HttpSession session = request.getSession();
				grupo.setUsuario(usuarioSessao);
				
				
				//cria o grupo
				this.grupoServico.criar(grupo);
				
				grupo = grupoServico.recuperar(grupo);
				modelo.addAttribute("sucesso", "Grupo adicionado com sucesso.");
				modelo.addAttribute("grupo", grupo);
				
			} //se ocorrer alguma exceção
			catch (ServicoException e) {
				//envia a mensagem de erro
				modelo.addAttribute("erro", e.getMessage());
				return "grupo.formulario";
			}
			
			return "grupo.detalhe";

		} else {
			return "grupo.formulario";
		}
		
	}
	

	@RequestMapping(value="/atualizar", method=RequestMethod.POST)
	public String atualizar(@Valid Grupo grupo, BindingResult result, Model modelo){
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
		//verifica se os campos dos formulários são válidos
		if (!result.hasFieldErrors()) {

			try {
				grupo.setUsuario(usuarioSessao);
				
				//atualiza grupo
				this.grupoServico.atualizar(grupo);
				
				grupo = grupoServico.recuperar(grupo);
				modelo.addAttribute("sucesso", "Grupo alterado com sucesso.");
				modelo.addAttribute("grupo", grupo);
				
			} //se ocorrer alguma exceção
			catch (ServicoException e) {
				//envia a mensagem de erro
				modelo.addAttribute("erro", e.getMessage());
				return "grupo.formularioAtualizar";
			}
			
			return "grupo.detalhe";

		} else {
			return "grupo.formularioAtualizar";
		}
		
	}
	
	
	@RequestMapping(value="/excluir", method=RequestMethod.POST)
	public String excluir(@Valid Grupo grupo, BindingResult result, Model modelo){
		try {
			
			//atualiza grupo
			this.grupoServico.deletar(grupo);
			
			modelo.addAttribute("sucesso", "Grupo excluído com sucesso.");
			
		} //se ocorrer alguma exceção
		catch (ServicoException e) {
			//envia a mensagem de erro
			modelo.addAttribute("erro", e.getMessage());
		}
		
		
		//recupera listagem dos grupos
		try {
			List<Grupo> grupos = grupoServico.recuperarTodos(usuarioSessao);
			modelo.addAttribute("grupos", grupos);
		} catch (Exception e) {
			modelo.addAttribute("erro", e.getMessage());
		}
		
		
		return "grupo.listagem";

	}
	
	//listagem de grupos
	@RequestMapping("/listar")
	public String listar(Model modelo) {
		try {
			List<Grupo> grupos = grupoServico.recuperarTodos(usuarioSessao);
			modelo.addAttribute("grupos", grupos);
		} catch (Exception ex) {
			modelo.addAttribute("erro", ex.getMessage());
			// TODO: handle exception
		}
		
		return "grupo.listagem";	
	}
	
}
